<!--
 * @Description: 
 * @Author: dh
 * @Date: 2021-09-15 10:32:03
 * @LastEditors: dh
 * @LastEditTime: 2021-09-16 16:12:15
-->
<!doctype html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>6、寄生组合继承</title>
	</head>
	<!-- 

        核心：通过寄生方式，砍掉父类的实例属性，这样，在调用两次父类的构造的时候，就不会初始化两次实例方法/属性，避免的组合继承的缺点

        特点：
            堪称完美
        缺点：
            实现较为复杂 
 -->

	<body>
		<script>
			function Animal(name) {
				this.name = name || 'Animal';
				this.sleep = function () {
					console.log(this.name + '正在睡觉！');
				};
			}
			// 原型方法
			Animal.prototype.eat = function (food) {
				console.log(this.name + '正在吃：' + food);
			};

			function Cat(name = 'Tom') {
				Animal.call(this, name);
			}
			(function () {
				// 创建一个没有实例方法的类
				function Super() {}
				Super.prototype = Animal.prototype;
				//将实例作为子类的原型
				Cat.prototype = new Super();
			})();

			Cat.prototype.constructor = Cat; // 需要修复下构造函数

			// Test Code
			var cat = new Cat();
			console.log(cat.name);
			console.log(cat.sleep());
			console.log(cat instanceof Animal); // true
			console.log(cat instanceof Cat); //true
		</script>
	</body>
</html>
